/*++

  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
                                                                                   
  SPDX-License-Identifier: BSD-2-Clause-Patent

                                                                                   



Module Name:

  SensorInfoVariable.h

Abstract:

  GUID used for Sensor Info variable.

--*/


//
//  Module:         SensorInfoVariable.h
//
//  Description:    Provides  structure  and  literal  definitions for the
//                  Sensor Information Variable.  The  BIOS  will  provide
//                  this  variable  to  runtime  applications  via the EFI
//                  GetVariable function.
//
//  Notes:      1.  When defining and initializing the variable within the
//                  BIOS, the module will define the structure  using  the
//                  typedef  macros  in  a block. For an ATX board using a
//                  single Heceta 6P, which has 4 temperature  sensors,  6
//                  voltage  sensors,  4 fan speed sensors and 3 fan speed
//                  controllers, this block would be declared as follows:
//
//                      TYPEDEF_TEMP_SENSOR_SECTION(4);
//                      TYPEDEF_VOLT_SENSOR_SECTION(6);
//                      TYPEDEF_FAN_SENSOR_SECTION(4);
//                      TYPEDEF_FAN_CONTROLLER_SENSOR(3);
//                      TYPEDEF_SENSOR_INFO_VAR;
//
//              2.  When crafting code to access the variable, the  module
//                  will  also  need  to  invoke  the  typedef macros in a
//                  block but, since it cannot declare a structure for the
//                overall variable (because array lengths will vary), it
//                cannot  use  TYPEDEF_SENSOR_INFO_VAR.  The  block will
//                typically be used as follows:
//
//                      TYPEDEF_TEMP_SENSOR_SECTION(1);
//                     TYPEDEF_VOLT_SENSOR_SECTION(1);
//                     TYPEDEF_FAN_SENSOR_SECTION(1);
//                     TYPEDEF_FAN_CONTROLLER_SENSOR(1);
//
//                 The structure buffer should instead be declared  as  a
//                 BYTE  array. Pointers to the various sections can then
//                  be built using the XXXX_SECTION_LEN macros...
//


#ifndef _SENSOR_INFO_VAR_GUID_H_
#define _SENSOR_INFO_VAR_GUID_H_

#define SENSOR_INFO_VAR_GUID \
  { \
    0xE59E7B4D, 0x06DC, 0x44AB, 0xB3, 0x6D, 0x5E, 0xD7, 0x78, 0x9C, 0x53, 0x0A \
  }

extern EFI_GUID gEfiSensorInfoVarGuid;
extern CHAR16   gEfiSensorInfoVarName[];
extern CHAR16   gEfiSensorInfoVarNameWithPassword[];

#define SENSOR_INFO_VAR_NAME L"SensorInfoVar"
#define SENSOR_INFO_VAR_NAME_WITH_PASSWORD SENSOR_INFO_VAR_NAME L"S4k?A^7!"

//
// Sensor/Controller usage definitions
//

#define UNKNOWN_OTHER                   0

//
// Temperature Sensors
//
#define CPU_CORE_TEMPERATURE            1
#define CPU_DIE_TEMPERATURE             2
#define ICH_TEMPERATURE                 3
#define MCH_TEMPERATURE                 4
#define VR_TEMPERATURE                  5
#define MEMORY_TEMPERATURE              6
#define MOTHERBOARD_AMBIENT_TEMPERATURE 7
#define SYSTEM_AMBIENT_AIR_TEMPERATURE  8
#define CPU_INLET_AIR_TEMPERATURE       9
#define SYSTEM_INLET_AIR_TEMPERATURE    10
#define SYSTEM_OUTLET_AIR_TEMPERATURE   11
#define PSU_HOTSPOT_TEMPERATURE         12
#define PSU_INLET_AIR_TEMPERATURE       13
#define PSU_OUTLET_AIR_TEMPERATURE      14
#define DRIVE_TEMPERATURE               15
#define GPU_TEMPERATURE                 16
#define IOH_TEMPERATURE                 17

#define LAST_TEMPERATURE                17

//
// Voltage Sensors
//
#define PLUS_12_VOLTS                   1
#define NEG_12_VOLTS                    2
#define PLUS_5_VOLTS                    3
#define PLUS_5_VOLT_BACKUP              4
#define NEG_5_VOLTS                     5
#define PLUS_3P3_VOLTS                  6
#define PLUS_2P5_VOLTS                  7
#define PLUS_1P5_VOLTS                  8
#define CPU_1_VCCP_VOLTAGE              9
#define CPU_2_VCCP_VOLTAGE              10
#define CPU_3_VCCP_VOLTAGE              11
#define CPU_4_VCCP_VOLTAGE              12
#define PSU_INPUT_VOLTAGE               13
#define MCH_VCC_VOLTAGE                 14
#define PLUS_3P3_VOLT_STANDBY           15
#define CPU_VTT_VOLTAGE                 16
#define PLUS_1P8_VOLTS                  17

#define LAST_VOLTAGE                    17

//
// Fan Speed Sensors and Controllers.
//
#define CPU_COOLING_FAN                 1
#define SYSTEM_COOLING_FAN              2
#define MCH_COOLING_FAN                 3
#define VR_COOLING_FAN                  4
#define CHASSIS_COOLING_FAN             5
#define CHASSIS_INLET_FAN               6
#define CHASSIS_OUTLET_FAN              7
#define PSU_COOLING_FAN                 8
#define PSU_INLET_FAN                   9
#define PSU_OUTLET_FAN                  10
#define DRIVE_COOLING_FAN               11
#define GPU_COOLING_FAN                 12
#define AUX_COOLING_FAN                 13
#define IOH_COOLING_FAN                 14

#define LAST_FAN                        14

//
// Fan Type Definitions
//
#define FAN_TYPE_UNKNOWN                0
#define FAN_3WIRE_PULSE                 1
#define FAN_3WIRE_VOLTAGE               2
#define FAN_4WIRE                       3

#pragma pack(1)

//
// TEMP_SENSOR_INFO - Structure providing info for a temperature sensor.
//
typedef struct _TEMP_SENSOR_INFO
{
    UINT8                               byDevice;       // Device index
    UINT8                               byIndex;        // Physical sensor index
    UINT8                               byUsage;        // Usage indicator
    UINT8                               bRelative;      // Relative vs. Absolute readings

} TEMP_SENSOR_INFO, *P_TEMP_SENSOR_INFO;

//
// TYPEDEF_TEMP_SENSOR_SECTION - Macro that can be used to typedef the
// TEMP_SENSOR_SECTION structure, which provides information about all
// temperature sensors.
//
#define TYPEDEF_TEMP_SENSOR_SECTION(count)                              \
typedef struct _TEMP_SENSOR_SECTION                                     \
{                                                                       \
    UINT8                               byCount;                        \
    TEMP_SENSOR_INFO                    stSensor[count];                \
                                                                        \
} TEMP_SENSOR_SECTION, *P_TEMP_SENSOR_SECTION

//
// VOLT_SENSOR_INFO - Structure providing info for a voltage sensor.
//
typedef struct _VOLT_SENSOR_INFO
{
    UINT8                               byDevice;       // Device index
    UINT8                               byIndex;        // Physical sensor index
    UINT8                               byUsage;        // Usage indicator

} VOLT_SENSOR_INFO, *P_VOLT_SENSOR_INFO;

//
// TYPEDEF_VOLT_SENSOR_SECTION - Macro that can be used to typedef the
// VOLT_SENSOR_SECTION structure, which provides information about all
// voltage sensors.
//
#define TYPEDEF_VOLT_SENSOR_SECTION(count)                              \
typedef struct _VOLT_SENSOR_SECTION                                     \
{                                                                       \
    UINT8                               byCount;                        \
    VOLT_SENSOR_INFO                    stSensor[count];                \
                                                                        \
} VOLT_SENSOR_SECTION, *P_VOLT_SENSOR_SECTION

//
// FAN_SENSOR_INFO - Structure providing info for a fan speed sensor.
//
typedef struct _FAN_SENSOR_INFO
{
    UINT8                               byDevice;       // Device index
    UINT8                               byIndex;        // Physical sensor index
    UINT8                               byUsage;        // Usage indicator
    UINT8                               byType;         // Fan type
    UINT8                               byController;   // Associated Fan Controller

} FAN_SENSOR_INFO, *P_FAN_SENSOR_INFO;

//
// TYPEDEF_FAN_SENSOR_SECTION - Macro that can be used to typedef the
// FAN_SENSOR_SECTION structure, which provides information about all fan
// speed sensors.
//
#define TYPEDEF_FAN_SENSOR_SECTION(count)                               \
typedef struct _FAN_SENSOR_SECTION                                      \
{                                                                       \
    UINT8                               byCount;                        \
    FAN_SENSOR_INFO                     stSensor[count];                \
                                                                        \
} FAN_SENSOR_SECTION, *P_FAN_SENSOR_SECTION

//
// FAN_CONTROLLER_INFO - Structure providing info for a fan speed controller.
//
#define MAX_ASSOC_FANS                  4
#define ASSOC_UNUSED                    0xFF

typedef struct _FAN_CONTROLLER_INFO
{
    UINT8                               byDevice;       // Device index
    UINT8                               byIndex;        // Physical Controller Index
    UINT8                               byUsage;        // Usage Indicator
    UINT8                               byFan[MAX_ASSOC_FANS]; // Associated Fan Sensors

} FAN_CONTROLLER_INFO, *P_FAN_CONTROLLER_INFO;

//
// TYPEDEF_FAN_CONTROLLER_SECTION - Macro that can be used to typedef the
// FAN_CONTROLLER_SECTION structure, which provides information about all
// fan speed controllers.
//
#define TYPEDEF_FAN_CONTROLLER_SECTION(count)                           \
typedef struct _FAN_CONTROLLER_SECTION                                  \
{                                                                       \
    UINT8                               byCount;                        \
    FAN_CONTROLLER_INFO                 stController[count];            \
                                                                        \
} FAN_CONTROLLER_SECTION, *P_FAN_CONTROLLER_SECTION

//
// TYPEDEF_SENSOR_INFO_VAR - Macro that can be used to typedef the
// SENSOR_INFO_VAR structure, which provides information about all sensors
// and fan speed controllers. The other TYPEDEF macros must be invoked
// before using this one...
//
#define TYPEDEF_SENSOR_INFO_VAR                                         \
typedef struct _SENSOR_INFO_VAR                                         \
{                                                                       \
    TEMP_SENSOR_SECTION                 stTemps;                        \
    VOLT_SENSOR_SECTION                 stVolts;                        \
    FAN_SENSOR_SECTION                  stFans;                         \
    FAN_CONTROLLER_SECTION              stCtrls;                        \
                                                                        \
} SENSOR_INFO_VAR, *P_SENSOR_INFO_VAR

#pragma pack()

#endif
